package com.duoshu.grj.sosoliuda.utils;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.view.View;

import com.duoshu.grj.sosoliuda.R;
import com.duoshu.grj.sosoliuda.SosoliudaApp;
import com.duoshu.grj.sosoliuda.ui.topic.SubjectPublishActivity1;
import com.duoshu.grj.sosoliuda.ui.view.UserDialog;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.compress.Luban;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.mylhyl.acp.Acp;
import com.mylhyl.acp.AcpListener;
import com.mylhyl.acp.AcpOptions;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;

import static com.duoshu.grj.sosoliuda.utils.StorageUtil.getImagesDir;
import static com.luck.picture.lib.config.PictureConfig.LUBAN_COMPRESS_MODE;

/**
 * 项目名称：ConsumSo
 * 类描述：头像上传 所用到的 图片裁剪等功能的工具类
 * 创建人：资拥
 * 创建时间：16/5/11 上午10:07
 * 修改人：资拥
 * 修改时间：16/5/11 上午10:07
 * 修改备注：
 */
public class ImageCropUtils {
    public static final int GET_IMAGE_BY_CAMERA = 5001;
    public static final int GET_IMAGE_FROM_PHONE = 5002;
    public static final int CROP_IMAGE = 5003;
    public static Uri imageUriFromCamera;
    public static Uri cropImageUri;


    public static void openCameraImage(final Activity activity) {
        ImageCropUtils.imageUriFromCamera = ImageCropUtils
                .createImagePathUri(activity);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageCropUtils.imageUriFromCamera);
        activity.startActivityForResult(intent, ImageCropUtils.GET_IMAGE_BY_CAMERA);
    }


    public static void openLocalImage(final Activity activity) {
//        Intent intent = new Intent();
//        intent.setType("image/*");
//        intent.setAction(Intent.ACTION_GET_CONTENT);
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        activity.startActivityForResult(intent, ImageCropUtils.GET_IMAGE_FROM_PHONE);
    }


    public static Uri createImagePathUri(Context context) {
        Uri imageFilePath;
        SimpleDateFormat timeFormatter = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA);
        long time = System.currentTimeMillis();
        String imageName = timeFormatter.format(new Date(time));
        imageFilePath = Uri.parse("file://" + StorageUtil.getImagesDir() + "/img_" + imageName);
        return imageFilePath;
    }


    public static void crop(Activity activity, Uri uri) {
        ImageCropUtils.cropImageUri = ImageCropUtils
                .createImagePathUri(activity);
        if (uri == null) {
            return;
        }
        // 裁剪图片意图
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        // 裁剪框的比例，1：1
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // 裁剪后输出图片的尺寸大小
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true);
        // 图片格式
        intent.putExtra("outputFormat", "JPEG");
        intent.putExtra("noFaceDetection", true);// 取消人脸识别
        intent.putExtra("return-data", false);// true:不返回uri，false：返回uri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageCropUtils.cropImageUri);
        activity.startActivityForResult(intent, CROP_IMAGE);
    }


    public static void deleteImageUri(Context context, Uri uri) {
//        context.getContentResolver().delete(uri, null, null);
        DataCleanManager.cleanCustomCache(uri.getPath());
    }


    public static File uri2File(Uri uri, Activity activity) {
        File file;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor actualimagecursor;
        actualimagecursor = activity.getContentResolver()
                .query(uri, proj, null, null, null);

        if (actualimagecursor != null) {
            AtomicInteger actual_image_column_index = new AtomicInteger(actualimagecursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
            actualimagecursor.moveToFirst();
            String img_path = actualimagecursor
                    .getString(actual_image_column_index.get());
            file = new File(img_path);
            return file;
        }
        return null;
    }

    /**
     * 生成QR图
     *
     * @param content   生成二维码的正文内容
     * @param qr_width  二维码宽
     * @param qr_height 二维码高
     */
    public static Bitmap createQRbitmap(String content, int qr_width, int qr_height) {
        Bitmap bitmap = null;
        try {
            // 把输入的文本转为二维码
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //去二维码白边
            hints.put(EncodeHintType.MARGIN, "0");
            BitMatrix bitMatrix = new QRCodeWriter().encode(content,
                    BarcodeFormat.QR_CODE, qr_width, qr_height, hints);
            int[] pixels = new int[qr_width * qr_height];
            for (int y = 0; y < qr_height; y++) {
                for (int x = 0; x < qr_width; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * qr_width + x] = 0xff000000;
                    } else {
                        pixels[y * qr_width + x] = 0xffffffff;
                    }
                }
            }
            bitmap = Bitmap.createBitmap(qr_width, qr_height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, qr_width, 0, 0, qr_width, qr_height);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    /**
     * view生成图片（无水印）
     * @param view
     * @return
     */
    public static Bitmap viewToBitmap(View view) {
        return viewToBitmap(view, Bitmap.Config.RGB_565);
    }
    public static Bitmap viewToBitmap(View view, Bitmap.Config bc) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
                bc);
        // 利用bitmap生成画布
        Canvas canvas = new Canvas(bitmap);
        // 把view中的内容绘制在画布上
        view.draw(canvas);
        return bitmap;
    }

    /**
     * view生成图片（有水印）
     *
     * @param context
     * @param view
     * @param shuiyin
     * @return
     */
    public static Bitmap viewToBitmap(Context context, View view, int shuiyin) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
                Bitmap.Config.RGB_565);
        // 利用bitmap生成画布
        Canvas canvas = new Canvas(bitmap);
        // 把view中的内容绘制在画布上
        view.draw(canvas);
        if (shuiyin < 0) {
            Bitmap resource = BitmapFactory.decodeResource(context.getResources(),
                    shuiyin);
            Bitmap bitmap2 = createBitmap(context, bitmap, resource);
            return bitmap2;
        }
        return bitmap;
    }

    /**
     * 图片打水印
     *
     * @param context
     * @param src
     * @param watermark
     * @return
     */
    public static Bitmap createBitmap(Context context, Bitmap src, Bitmap watermark) {
        int w = src.getWidth();
        int h = src.getHeight();
        int ww = watermark.getWidth();
        int wh = watermark.getHeight();
        Bitmap newb = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);// 创建一个新的和SRC长度宽度一样的位图
        Canvas cv = new Canvas(newb);
        Paint paint = new Paint();
        paint.setAlpha(50);
        cv.drawBitmap(src, 0, 0, null);// 在 0，0坐标开始画入src
        cv.drawBitmap(watermark, w - ww - 10, h - wh, null);// 在src的左下角画入水印
        cv.save(Canvas.ALL_SAVE_FLAG);// 保存
        cv.restore();// 存储
        return newb;
    }

    /**
     * 保存图片方法
     *
     * @param bitmap     图片
     * @param imageName  保存的图片名称
     * @param iscompress 是否压缩
     * @param size       压缩大小(KB)
     * @return
     */
    public static String compressImage(Bitmap bitmap, String imageName, boolean iscompress, float size) {
        ByteArrayOutputStream byteArrayOutputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            File file = new File(getImagesDir(), imageName);
            if (file.exists()) {
                file.delete();
            }
            if (!file.exists()) {
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            fileOutputStream = new FileOutputStream(file);
            if (iscompress)
                fileOutputStream.write(compressBitmap(bitmap, size));
            else
                fileOutputStream.write(bitmapToBytes(bitmap, true));
            fileOutputStream.flush();
            return Uri.fromFile(file).getPath();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != byteArrayOutputStream) {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                }
            }
            if (null != fileOutputStream) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                }
            }
        }
        return null;
    }

    /**
     * 保存图片方法
     *
     * @param path      图片
     * @param imageName 保存的图片名称
     * @return
     */
    public static String compressImage(String path, String imageName, int size) {
        ByteArrayOutputStream byteArrayOutputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            File file = new File(getImagesDir(), imageName);
            if (file.exists()) {
                file.delete();
            }
            if (!file.exists()) {
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(getImage(path, size));
            fileOutputStream.flush();
            return Uri.fromFile(file).getPath();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != byteArrayOutputStream) {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                }
            }
            if (null != fileOutputStream) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                }
            }
        }
        return null;
    }

    public static byte[] getImage(String srcPath, int size) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片，此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空
        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        float ww = UiUtil.getDisplayWidth(SosoliudaApp.getInstance());
        // 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
        newOpts.inSampleSize = (int) (w > ww ? w / ww : 1f);// 设置缩放比例
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        return compressBitmap(bitmap, size);// 压缩好比例大小后再进行质量压缩
    }

    /**
     * 压缩图片
     *
     * @param bitmap
     * @param size
     * @return
     */
    public static byte[] compressBitmap(Bitmap bitmap, float size) {
        if (bitmap == null || getSizeOfBitmap(bitmap) <= size || size == -1) {
            byte[] bitmap2Bytes = bitmapToBytes(bitmap, true);
            bitmap.recycle();
            return bitmap2Bytes;// 如果图片本身的大小已经小于这个大小了，就没必要进行压缩
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 如果前面是png的话，则不管quality是多少，都不会进行质量的压缩
        int quality = 100;
        while (baos.toByteArray().length / 1024f > size && quality > 5) {
            quality -= 5;// 每次都减少10
            baos.reset();// 重置baos即清空baos
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        }
        bitmap.recycle();
        return baos.toByteArray();
    }

    /**
     * 获取bitmap的大小
     *
     * @param bitmap 图片的bitmap格式
     * @return 返回bitmap多少kb
     */
    public static float getSizeOfBitmap(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 这里100的话表示不压缩质量
        long length = baos.toByteArray().length / 1024;// 读出图片的kb大小
        return length;
    }

    /**
     * Bitmap转字节数组
     *
     * @return
     */
    public static byte[] bitmapToBytes(Bitmap bm, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bm.recycle();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 根据Uri获取图片绝对路径，解决Android4.4以上版本Uri转换
     *
     * @param context
     * @param imageUri
     */
    @TargetApi(19)
    public static String getImageAbsolutePath(Activity context, Uri imageUri) {
        if (context == null || imageUri == null)
            return null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, imageUri)) {
            if (isExternalStorageDocument(imageUri)) {
                String docId = DocumentsContract.getDocumentId(imageUri);
                String[] split = docId.split(":");
                String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(imageUri)) {
                String id = DocumentsContract.getDocumentId(imageUri);
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } else if (isMediaDocument(imageUri)) {
                String docId = DocumentsContract.getDocumentId(imageUri);
                String[] split = docId.split(":");
                String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                String selection = MediaStore.Images.Media._ID + "=?";
                String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        } // MediaStore (and general)  
        else if ("content".equalsIgnoreCase(imageUri.getScheme())) {
            // Return the remote address  
            if (isGooglePhotosUri(imageUri))
                return imageUri.getLastPathSegment();
            return getDataColumn(context, imageUri, null, null);
        }
        // File  
        else if ("file".equalsIgnoreCase(imageUri.getScheme())) {
            return imageUri.getPath();
        }
        return null;
    }

    /**
     * base64转为bitmap
     *
     * @param base64Data
     * @return
     */
    public static Bitmap base64ToBitmap(String base64Data) {
        byte[] bytes = android.util.Base64.decode(base64Data, android.util.Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

    public static String getDataColumn(Activity context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        String column = MediaStore.Images.Media.DATA;
        String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

    public static void openCamera(final Activity activity){
        //拍照
        Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {
            @Override
            public void onGranted() {
                // 单独拍照
                PictureSelector.create(activity)
                        .openCamera(PictureMimeType.ofImage())// 单独拍照，也可录像或也可音频 看你传入的类型是图片or视频
                        .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles
//                        .maxSelectNum(maxSelectNum)// 最大图片选择数量
//                        .minSelectNum(1)// 最小选择数量
//                        .selectionMode(cb_choose_mode.isChecked() ?
//                                PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
                        .previewImage(true)// 是否可预览图片
//                        .previewVideo(cb_preview_video.isChecked())// 是否可预览视频
//                        .enablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频
                        .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                        .isCamera(false)// 是否显示拍照按钮
                        .enableCrop(false)// 是否裁剪
                        .compress(true)// 是否压缩
                        .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                        .glideOverride(160, 160)// glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                        .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                        .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示
                        .isGif(true)// 是否显示gif图片
//                        .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
//                        .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
//                        .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
//                        .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
//                        .openClickSound(cb_voice.isChecked())// 是否开启点击声音
//                        .selectionMedia(list)// 是否传入已选图片
                        .previewEggs(false)//预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                        //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                        //.cropCompressQuality(90)// 裁剪压缩质量 默认为100
                        //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                        //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                        //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                        //.rotateEnabled() // 裁剪是否可旋转图片
                        //.scaleEnabled()// 裁剪是否可放大缩小图片
                        //.videoQuality()// 视频录制质量 0 or 1
                        //.videoSecond()////显示多少秒以内的视频or音频也可适用
                        .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
            }

            @Override
            public void onDenied(List<String> permissions) {
                ToastUtils.toastSingle("拒绝权限无法拍照");
            }
        });
    }

    /**
     * 打开图库
     * @param activity
     * @param maxNum
     */
    public static void openImg(final Activity activity,final int maxNum){
        Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE).build(), new AcpListener() {
            @Override
            public void onGranted() {
                PictureSelector.create(activity)
                        .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                        .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles   用法：R.style.picture.white.style
                        .maxSelectNum(maxNum)// 最大图片选择数量
                        .minSelectNum(1)// 最小选择数量
                        .imageSpanCount(3)// 每行显示个数
                        .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE : PictureConfig.SINGLE
                        .previewImage(true)// 是否可预览图片
//                        .previewVideo(true)// 是否可预览视频
//                        .enablePreviewAudio(true) // 是否可播放音频
//                        .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                        .isCamera(true)// 是否显示拍照按钮
                        .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                        //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
                        .enableCrop(false)// 是否裁剪
                        .compress(true)// 是否压缩
                        .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                        .isGif(true)// 是否显示gif图片
//                        .selectionMedia(list)// 是否传入已选图片
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                        //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                        //.cropCompressQuality(90)// 裁剪压缩质量 默认100
                        //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                        //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                        //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                        //.rotateEnabled() // 裁剪是否可旋转图片
                        //.scaleEnabled()// 裁剪是否可放大缩小图片
                        //.videoQuality()// 视频录制质量 0 or 1
                        //.videoSecond()//显示多少秒以内的视频or音频也可适用
                        //.recordVideoSecond()//录制视频秒数 默认60s
                        .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
            }

            @Override
            public void onDenied(List<String> permissions) {
                ToastUtils.toastSingle("拒绝权限无法选择相册");
            }
        });
    }
    /**
     * 选取照片（拍照或本地相册）
     */
    public static void openSetImgDialog(final Activity activity, final int maxNum, final List<LocalMedia> list) {
        final UserDialog photoDialog = new UserDialog(activity);
        photoDialog.openSetImgDialog(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                photoDialog.dismiss();
                //拍照
                Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {
                    @Override
                    public void onGranted() {
                        // 单独拍照
                        PictureSelector.create(activity)
                                .openCamera(PictureMimeType.ofImage())// 单独拍照，也可录像或也可音频 看你传入的类型是图片or视频
                                .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles
//                        .maxSelectNum(maxSelectNum)// 最大图片选择数量
//                        .minSelectNum(1)// 最小选择数量
//                        .selectionMode(cb_choose_mode.isChecked() ?
//                                PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
                                .previewImage(true)// 是否可预览图片
//                        .previewVideo(cb_preview_video.isChecked())// 是否可预览视频
//                        .enablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频
                                .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                                .isCamera(false)// 是否显示拍照按钮
                                .enableCrop(false)// 是否裁剪
                                .compress(true)// 是否压缩
                                .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                                .glideOverride(160, 160)// glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                        .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                                .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示
                                .isGif(true)// 是否显示gif图片
//                        .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
//                        .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
//                        .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
//                        .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
//                        .openClickSound(cb_voice.isChecked())// 是否开启点击声音
                                .selectionMedia(list)// 是否传入已选图片
                                .previewEggs(false)//预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.cropCompressQuality(90)// 裁剪压缩质量 默认为100
                                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                                //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                                //.rotateEnabled() // 裁剪是否可旋转图片
                                //.scaleEnabled()// 裁剪是否可放大缩小图片
                                //.videoQuality()// 视频录制质量 0 or 1
                                //.videoSecond()////显示多少秒以内的视频or音频也可适用
                                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
                    }

                    @Override
                    public void onDenied(List<String> permissions) {
                        ToastUtils.toastSingle("拒绝权限无法拍照");
                    }
                });
            }
        }, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //从相册中选择
                photoDialog.dismiss();
                Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE).build(), new AcpListener() {
                    @Override
                    public void onGranted() {
                        PictureSelector.create(activity)
                                .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                                .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles   用法：R.style.picture.white.style
                                .maxSelectNum(maxNum)// 最大图片选择数量
                                .minSelectNum(1)// 最小选择数量
                                .imageSpanCount(3)// 每行显示个数
                                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE : PictureConfig.SINGLE
                                .previewImage(true)// 是否可预览图片
//                        .previewVideo(true)// 是否可预览视频
//                        .enablePreviewAudio(true) // 是否可播放音频
//                        .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                                .isCamera(true)// 是否显示拍照按钮
                                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                                //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
                                .enableCrop(false)// 是否裁剪
                                .compress(true)// 是否压缩
                                .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                                .isGif(true)// 是否显示gif图片
                                .selectionMedia(list)// 是否传入已选图片
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.cropCompressQuality(90)// 裁剪压缩质量 默认100
                                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                                //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                                //.rotateEnabled() // 裁剪是否可旋转图片
                                //.scaleEnabled()// 裁剪是否可放大缩小图片
                                //.videoQuality()// 视频录制质量 0 or 1
                                //.videoSecond()//显示多少秒以内的视频or音频也可适用
                                //.recordVideoSecond()//录制视频秒数 默认60s
                                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
                    }

                    @Override
                    public void onDenied(List<String> permissions) {
                        ToastUtils.toastSingle("拒绝权限无法选择相册");
                    }
                });
            }
        });
    }
    /**
     * 选取照片（拍照或本地相册）
     */
    public static void openSetImgDialog(final Activity activity, final int maxNum) {
        final UserDialog photoDialog = new UserDialog(activity);
        photoDialog.openSetImgDialog(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                photoDialog.dismiss();
                //拍照
                Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {
                    @Override
                    public void onGranted() {
                        // 单独拍照
                        PictureSelector.create(activity)
                                .openCamera(PictureMimeType.ofImage())// 单独拍照，也可录像或也可音频 看你传入的类型是图片or视频
                                .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles
//                        .maxSelectNum(maxSelectNum)// 最大图片选择数量
//                        .minSelectNum(1)// 最小选择数量
//                        .selectionMode(cb_choose_mode.isChecked() ?
//                                PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
                                .previewImage(true)// 是否可预览图片
//                        .previewVideo(cb_preview_video.isChecked())// 是否可预览视频
//                        .enablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频
                                .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                                .isCamera(false)// 是否显示拍照按钮
                                .enableCrop(false)// 是否裁剪
                                .compress(true)// 是否压缩
                                .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                                .glideOverride(160, 160)// glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                        .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                                .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示
                                .isGif(true)// 是否显示gif图片
//                        .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
//                        .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
//                        .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
//                        .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
//                        .openClickSound(cb_voice.isChecked())// 是否开启点击声音
//                                .selectionMedia(list)// 是否传入已选图片
                                .previewEggs(false)//预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.cropCompressQuality(90)// 裁剪压缩质量 默认为100
                                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                                //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                                //.rotateEnabled() // 裁剪是否可旋转图片
                                //.scaleEnabled()// 裁剪是否可放大缩小图片
                                //.videoQuality()// 视频录制质量 0 or 1
                                //.videoSecond()////显示多少秒以内的视频or音频也可适用
                                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
                    }

                    @Override
                    public void onDenied(List<String> permissions) {
                        ToastUtils.toastSingle("拒绝权限无法拍照");
                    }
                });
            }
        }, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //从相册中选择
                photoDialog.dismiss();
                Acp.getInstance(activity).request(new AcpOptions.Builder().setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE).build(), new AcpListener() {
                    @Override
                    public void onGranted() {
                        PictureSelector.create(activity)
                                .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                                .theme(R.style.picture_default_style)// 主题样式设置 具体参考 values/styles   用法：R.style.picture.white.style
                                .maxSelectNum(maxNum)// 最大图片选择数量
                                .minSelectNum(1)// 最小选择数量
                                .imageSpanCount(3)// 每行显示个数
                                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE : PictureConfig.SINGLE
                                .previewImage(true)// 是否可预览图片
//                        .previewVideo(true)// 是否可预览视频
//                        .enablePreviewAudio(true) // 是否可播放音频
//                        .compressGrade(Luban.THIRD_GEAR)// luban压缩档次，默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
                                .isCamera(true)// 是否显示拍照按钮
                                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                                //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
                                .enableCrop(false)// 是否裁剪
                                .compress(true)// 是否压缩
                                .compressMode(LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
                                .isGif(true)// 是否显示gif图片
//                                .selectionMedia(list)// 是否传入已选图片
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                                //.cropCompressQuality(90)// 裁剪压缩质量 默认100
                                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                                //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
                                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                                //.rotateEnabled() // 裁剪是否可旋转图片
                                //.scaleEnabled()// 裁剪是否可放大缩小图片
                                //.videoQuality()// 视频录制质量 0 or 1
                                //.videoSecond()//显示多少秒以内的视频or音频也可适用
                                //.recordVideoSecond()//录制视频秒数 默认60s
                                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
                    }

                    @Override
                    public void onDenied(List<String> permissions) {
                        ToastUtils.toastSingle("拒绝权限无法选择相册");
                    }
                });
            }
        });
    }
}
